package com.wtx.fitness.util;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;
import org.springframework.stereotype.Component;

import java.nio.charset.StandardCharsets;
import java.security.Key;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * JWT工具类 - 使用HS512算法
 */
@Component
public class JwtUtil {

  // 使用固定密钥字符串（至少32位）
  private static final String SECRET_STRING = "FitnessPlatformSecretKey123456789012345678901234567890";

  // 通过固定密钥字符串生成密钥
  private static final Key SECRET_KEY = Keys.hmacShaKeyFor(SECRET_STRING.getBytes(StandardCharsets.UTF_8));

  // token有效期（毫秒）
  private static final long EXPIRATION_TIME = 24 * 60 * 60 * 1000; // 24小时

  /**
   * 生成JWT token
   * 
   * @param userId   用户ID
   * @param userType 用户类型
   * @return JWT token
   */
  public static String generateToken(String userId, String userType) {
    Map<String, Object> claims = new HashMap<>();
    claims.put("type", userType);

    return Jwts.builder()
        .setClaims(claims)
        .setSubject(userId)
        .setIssuedAt(new Date())
        .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME))
        .signWith(SECRET_KEY)
        .compact();
  }

  /**
   * 解析JWT token
   * 
   * @param token JWT token
   * @return Claims
   */
  public static Claims parseJWT(String token) {
    if (token == null || token.isEmpty()) {
      return null;
    }

    try {
      Claims claims = Jwts.parser()
          .setSigningKey(SECRET_KEY)
          .parseClaimsJws(token)
          .getBody();
      return claims;
    } catch (Exception e) {
      e.printStackTrace();
      return null;
    }
  }

  /**
   * 验证token是否过期
   * 
   * @param token JWT token
   * @return 是否有效
   */
  public static boolean validateToken(String token) {
    try {
      Claims claims = parseJWT(token);
      return claims != null && !claims.getExpiration().before(new Date());
    } catch (Exception e) {
      return false;
    }
  }

  /**
   * 从token中获取用户ID
   * 
   * @param token JWT token
   * @return 用户ID
   */
  public static String getUserIdFromToken(String token) {
    try {
      Claims claims = parseJWT(token);
      return claims != null ? claims.getSubject() : null;
    } catch (Exception e) {
      return null;
    }
  }

  /**
   * 从token中获取用户类型
   * 
   * @param token JWT token
   * @return 用户类型
   */
  public static String getUserTypeFromToken(String token) {
    try {
      Claims claims = parseJWT(token);
      return claims != null ? claims.get("type", String.class) : null;
    } catch (Exception e) {
      return null;
    }
  }
}